#include "queue.h"
#include<queue>

// 创建队列，默认大小为１２
template<class T>
ArrayQueue<T>::ArrayQueue(){
        arr = new T[12];
        if(!arr) {
                cout<<"arra malloc error!"<<endl;
        }
}

//销毁队列
template<class T>
ArrayQueue<T>::~ArrayQueue()
{
        if(arr) {
                delete[] arr;
                arr = NULL;
        }
}

//将ｖａｌ添加到队列的末尾
template<class T>
void ArrayQueue<T>::add(T t)
{
        arr[count++] = t;
}

template<class T>
T ArrayQueue<T>::front()
{
        return arr[0];
}

// 返回队列开头元素
template<class T>
T ArrayQueue<T>::pop()
{
        int i = 0;
        T ret = arr[0];

        count--;
        while(i++<count){
                arr[i-1] = arr[i];
        }
        return ret;
}

//返回队列的大小
template<class T>
int ArrayQueue<T>::size()
{
        return count;
}

//返回队列是否为空
template<class T>
int ArrayQueue<T>::is_empty(){
        return count == 0;
}


void runQueueDemo(){
        int tmp=0;
        ArrayQueue<int> *astack = new ArrayQueue<int>();

        //将１０，２０，３０，依次推入到队列中
        astack->add(10);
        astack->add(20);
        astack->add(30);

        //将队列开头元素赋值给ｔｍｐ，并删除该元素
        tmp = astack->pop();
        cout<<"tmp ="<<tmp<<endl;

        //只将队列开头的元素赋值给ｔｍｐ，不删除该元素
        tmp = astack->front();
        cout<<"tmp="<<tmp<<endl;

        astack->add(40);
        cout<<"is_empty()="<<astack->is_empty()<<endl;
        cout<<"size()="<<astack->size()<<endl;
        while(!astack->is_empty()) {
                tmp = astack->pop();
                cout<<tmp<<endl;
        }
}


void runQueueDemo2(){
        int tmp=0;
        queue<int> iqueue;

        //将１０，２０，３０依次加入队列的末尾
        iqueue.push(10);
        iqueue.push(20);
        iqueue.push(30);

        //删除队列开头的元素
        iqueue.pop();

        //将队列开头的元素赋值给ｔｍｐ，不删除该元素
        tmp = iqueue.front();
        cout<<"tmp="<<tmp<<endl;

        //将４０加入队列的末尾
        iqueue.push(40);

        cout<<"empty() =="<<iqueue.empty()<<endl;
        cout<<"size()="<<iqueue.size()<<endl;
        while(!iqueue.empty()) {
                tmp = iqueue.front();
                cout<<tmp<<endl;
                iqueue.pop();
        }
}
